package com.eksboot;

/**
 * CRC
 *
 * @author: chenfenghai
 * @version: 1.0
 * @date: 2020-04-26 14:01
 * @blame Team
 */
public class CRC {

    public static int [] getCrc(byte[] data) {
        int flag;
        // 16位寄存器，所有数位均为1
        int wcrc = 0xffff;
        for (byte datum : data) {
            // 16 位寄存器的低位字节
            // 取被校验串的一个字节与 16 位寄存器的低位字节进行“异或”运算
            wcrc = wcrc ^ datum;
            for (int j = 0; j < 8; j++) {
                flag = wcrc & 0x0001;
                // 把这个 16 寄存器向右移一位
                wcrc = wcrc >> 1;
                // 若向右(标记位)移出的数位是 1,
                // 则生成多项式 1010 0000 0000 0001 和这个寄存器进行“异或”运算
                if (flag == 1) {
                    wcrc ^= 0xa001;
                }
            }
        }
        //获取低八位
        int low = wcrc >> 8;
        //或者wcrc/256
        int up = wcrc % 256;
        //获取高八位
        int [] crc = {up, low};
        return crc;
    }

    public static String CRC16(String temp) {
        Integer[] regs = new Integer[temp.length()];
        for (int i = 0; i < temp.length(); i++) {
            regs[i] = (int)temp.charAt(i);
        }
        int por = 0xFFFF;
        for (int j = 0; j < regs.length; j++) {
            por = por >> 8;
            por ^= regs[j];
            for (int i = 0; i < 8; i++) {
                if ((por & 0x01) == 1) {
                    por = por >> 1;
                    por = por ^ 0xa001;
                } else {
                    por = por >> 1;
                }
            }
        }
        return Integer.toHexString(por);
    }
}
